<?php
namespace Admin\Controller;
use Think\Controller;
class GoodsCateController extends CommonController {
   
    //浏览商品分类信息
    public function index(){
       //实例化商品分类信息操作对象 
       $mod = M("cate");
       $count      = $mod->count();// 查询满足要求的总记录数
       $Page       = new \Think\Page($count,10);// 实例化分页类 传入总记录数和每页显示的记录数(25)

       $Page -> setConfig('header','共%TOTAL_ROW%条');
       $Page -> setConfig('first','首页');
       $Page -> setConfig('last','共%TOTAL_PAGE%页');
       $Page -> setConfig('prev','上一页');
       $Page -> setConfig('next','下一页');
       $Page -> setConfig('link','indexpagenumb');//pagenumb 会替换成页码
       $Page -> setConfig('theme','%HEADER% %NOW_PAGE%/%TOTAL_PAGE% 页 %FIRST% %UP_PAGE% %DOWN_PAGE% %END% %LINK_PAGE%');

       $show       = $Page->show();// 分页显示输出
       // 进行分页数据查询 注意limit方法的参数要使用Page类的属性
       // //select c1.*,concat(c1.path,',',c1.id) as sort_str,c2.name as s_name from shop_cate as c1 left join shop_cate as c2 on c1.pid = c2.id order by sort_str asc

       $list = M('cate c1')->field(array('c1.*','concat(c1.path,",",c1.id)'=>'sort_str','c2.name'=> 's_name'))->join('cate as c2 ON c1.pid = c2.id','LEFT')->order('sort_str asc')->limit($Page->firstRow.','.$Page->listRows)->select();

       // dump($list);die;
       // 修改显示添加缩进符号
       foreach($list as $k => $v)
       {
          if(empty($v['s_name']))
          {
            $list[$k]['s_name'] = '----'; 
          }

          //拆分成数组
          $arr = explode(',',$v['path']);
          //统计数组元素个数
          $num = count($arr)-1;
          //重复字符串
          $str = str_repeat('　|---',$num);
          //拼接修改name名称
          $list[$k]['name'] = $str.$v['name'];
       }
       //放置模板中
       $this->assign("list",$list);
       $this->assign('page',$show);// 赋值分页输出
       //加载模板输出
       $this->display("index");
    }

    //加载添加表单
    public function add(){
             //实例化商品分类信息操作对象 
       $mod = M("cate");
       
       $cate = M('cate c1')->field(array('c1.*','concat(c1.path,",",c1.id)'=>'sort_str','c2.name'=> 's_name'))->join('cate as c2 ON c1.pid = c2.id','LEFT')->order('sort_str asc')->select();
      
       // 修改显示添加缩进符号
       foreach($cate as $k => $v)
       {
          
          //拆分成数组
          $arr = explode(',',$v['path']);
          //统计数组元素个数
          $num = count($arr)-1;
          //重复字符串
          $str = str_repeat('　|---',$num);
          //拼接修改name名称
          $cate[$k]['name'] = $str.$v['name'];
       }

       //放置模板中
       $this->assign("cate",$cate);
       $this->display("add"); 
    }

    //执行信息添加
    public function insert(){
        //实例化
        $mod = M("cate");
        //自动验证
        $rules = array(
          array('name','','分类名称已经存在！',1,'unique',1),
          array('name','/\S+/','分类名称必须填写！',1,'regex',1), 
          array('keywords','/\S+/','关键字必须填写！',1,'regex',1),   
          array('description','/\S+/','描述必须填写！',1,'regex',1),  
        );  
        
        // dump($mod->path);die;
        if (!$mod->validate($rules)->create()){
             // 如果创建失败 表示验证没有通过 输出错误提示信息
             $this->error($mod->getError());
        }
          //生成path
        $id = I('post.pid/d');
        
        //如果分类下有商品不能添加下级分类
        if(M('goods')->where('cid='.$id)->select())
        {
          $this->error('分类下有商品，不能添加下级分类！');
        }
        if($id)
        {
          $path = $mod->getFieldById($id,'path');
          //路径
          $mod->path=$path.','.$id;
          //层级
          // dump(explode(',',$mod->path));die;
          $mod->level = count(explode(',',$mod->path));

        }
        else
        {
          $mod->path = 0;
          $mod->level = 1;
        }
        
        //执行添加
        $m = $mod->add();
        //判断并输出对应的提示信息
        if($m>0){
           $this->success("添加成功！",U("GoodsCate/add"));
        }else{
           $this->error("添加失败！");
        }
    }

    //加载编辑表单
    public function edit(){
       //实例化商品分类信息操作对象 
       $mod = M("cate");
       
       $cate = M('cate c1')->field(array('c1.*','concat(c1.path,",",c1.id)'=>'sort_str','c2.name'=> 's_name'))->join('cate as c2 ON c1.pid = c2.id','LEFT')->order('sort_str asc')->select();

       // 修改显示添加缩进符号
       foreach($cate as $k => $v)
       {

          //拆分成数组
          $arr = explode(',',$v['path']);
          //统计数组元素个数
          $num = count($arr)-1;
          //重复字符串
          $str = str_repeat('　|---',$num);
          //拼接修改name名称
          $cate[$k]['name'] = $str.$v['name'];
       }
       //放置模板中
       $this->assign("cate",$cate);
        //获取要编辑的信息

        $ob = $mod->find(I('get.id/d'));
        //放置模板中
        $this->assign("v",$ob);
        //加载编辑模板
        $this->display("edit");
    }

    //执行信息修改
    public function update(){
        //实例化
        $mod =M("cate");
        //自动验证
        $rules = array(
          array('name','','分类名称已经存在！',1,'unique',2),
          array('name','/\S+/','分类名称必须填写！',1,'regex',2), 
          array('keywords','/\S+/','关键字必须填写！',1,'regex',2),   
          array('description','/\S+/','描述必须填写！',1,'regex',2),  
        );  
       


        if (!$mod->validate($rules)->create()){
             // 如果创建失败 表示验证没有通过 输出错误提示信息
             
             $this->error($mod->getError());
        }
         
        $id = I('post.id/d');
        $pid = I('post.pid/d');

        //查询是否只修改父类之外的字段
        $oldpid = (int)$mod->getFieldById($id,'pid');
        if($oldpid !== $pid)
        {
            //如果改动了父类，判断分类下是否有分类，有则提示不让改动
            
            if($mod->getFieldByPid($id,'pid'))
            {
              $this->error('该分类下有分类，不能修改父分类!');
            }

            //不能选择自己的分类为父分类
            
            if($pid == $id)
            {
                $this->error('不能选择自己的分类为父分类!');
            }

            //生成path

            $path = $mod->getFieldById($pid,'path');
            $mod->path=$path.','.$id;
        }
        

        //执行修改
        $m = $mod->save();
        //判断并输出对应的提示信息
        if($m!==false){
           $this->success("修改成功！",U("GoodsCate/index"));
        }else{
           $this->error("修改失败！");
        }
    }

    //执行信息删除
    public function del(){
       //实例化
       $mod = M('goods');
       //查询分类下是否有产品

           if($num = $mod->where('cid='.I('get.id/d'))->count())
           {
              $this->error("该分类下有产品，删除失败！请先删除该分类下的产品！");
           }
           else
           {
              $map['id'] = array('EQ',I('get.id/d'));
           }

       //实例化
       $mod = M("cate");
       // echo I('get.id/d');die;
       
       //如果改动了父类，判断分类下是否有分类，有则提示不让删除
        $id = I('get.id/d');
        // dump($mod->getFieldByPid($id,'pid'));die;
        if($mod->getFieldByPid($id,'pid'))
        {
          $this->error('该分类下有分类，不能删除分类!');
        }
       //执行删除
       $m = $mod->where($map)->delete();
       //判断并输出对应的提示信息
       if($m>0){
           $this->success("删除成功！",U("GoodsCate/index"));
       }else{
           $this->error("删除失败！");
       }
    }
}